#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "QSerialPort"      //串口
#include "QSerialPortInfo"  //串口信息
#include "QMessageBox"      //弹窗提示
#include "QDebug"           //调试信息
#include "QVector"          //动态数组
#include <QTime>            //定时器
#include <QPainter>         //坐标系绘图
#include <QTimer>

//定义串口指针
QSerialPort *COM = new QSerialPort();
QDateTime mycurrenttime;//系统当前时间
QDateTime mystarttime;//系统开始时间

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(COM,SIGNAL(readyRead()),this,SLOT(RX_fun()));//信号槽连接
    setplot();

}

MainWindow::~MainWindow()
{
    delete ui;
}

//刷新串口
void MainWindow::on_key_on_com_clicked()
{
    ui->availablePorts_com->clear();
    foreach (const QSerialPortInfo &info,QSerialPortInfo ::availablePorts() )
    {

       ui->availablePorts_com->addItem(info.portName());
       // 清空之前的串口列表
    }

}

//清除接收串口
void MainWindow::on_key_com_Rx_clicked()
{
  ui->textBrowser->clear();//清空接收区
}
void MainWindow::on_key_com_Tx_2_clicked()
{
  ui->textEdit->clear();//清空发送区
}
//发送串口
void MainWindow::on_key_com_Tx_clicked()
{
  COM->write(ui->textEdit->toPlainText().toLatin1());//串口写数据（发送数据）
}
//关闭串口
void MainWindow::on_key_off_clicked()
{
    //串口初始化参数
    QSerialPort::BaudRate BaudRate;//比特率
    QSerialPort::DataBits Databits;//数据位
    QSerialPort::StopBits stopbits;//停止位
    QSerialPort::Parity   checkBits;//奇偶检验位

    stopbits=QSerialPort::OneStop;//停止位 2
    Databits=QSerialPort::Data8;//数据位 8
    checkBits=QSerialPort::NoParity;//奇偶检验位 无

    if(ui->comboBox_BaudRate->currentText()=="1200")
    {
        BaudRate=QSerialPort::Baud1200;
    }
    else if(ui->comboBox_BaudRate->currentText()=="2400")
    {
        BaudRate=QSerialPort::Baud2400;
    }
    else if(ui->comboBox_BaudRate->currentText()=="4800")
    {
        BaudRate=QSerialPort::Baud4800;
    }
    else if(ui->comboBox_BaudRate->currentText()=="9600")
    {
        BaudRate=QSerialPort::Baud9600;
    }
    else if(ui->comboBox_BaudRate->currentText()=="14400")
    {
        BaudRate=QSerialPort::Baud14400;

    }
    else if(ui->comboBox_BaudRate->currentText()=="19200")
    {
        BaudRate=QSerialPort::Baud19200;

    }
    else if(ui->comboBox_BaudRate->currentText()=="115200")
    {
        BaudRate=QSerialPort::Baud115200;

    }
    else if(ui->comboBox_BaudRate->currentText()=="2000000")
    {
        BaudRate=QSerialPort::Baud2000000;

    }
    //串口初始化
    COM->setPortName(ui->availablePorts_com->currentText());//端口名字
    COM->setBaudRate(BaudRate);//波特率
    COM->setStopBits(stopbits);//停止位
    COM->setDataBits(Databits);//数据位
    COM->setParity(checkBits);//奇偶校验位
    //串口操作
    if(ui->key_off->text() == "打开串口")
    {
        if(COM->open(QIODevice::ReadWrite) == true)
        {

            mystarttime = QDateTime::currentDateTime();//图像横坐标初始值参考点，读取初始时间
            ui->key_off->setText("关闭串口");//按键文字
            ui->led->setStyleSheet("background-color:red");//变红
        }
        else
        {
            QMessageBox::critical(this,"错误提示","打开串口失败！或其他错误。\r\n请选择正确的串口或该串口被占用");//串口打开失败
        }
    }
    else if(ui->key_off->text() == "关闭串口")
    {
            COM->close();//关闭串口
            ui->key_off->setText("打开串口");//按键文字
            ui->led->setStyleSheet("background-color:black");//变黑
    }
}

//串口接收
void MainWindow::RX_fun()
{
    QByteArray buf = COM->readAll();
    if (!buf.isEmpty())
    {
 QTimer::singleShot(10, [this, buf]() {
        QString str = QString::fromUtf8(buf);
        int colonPos = buf.indexOf(":");
        int commaPos = -1;
        int secondCommaPos = -1;
        int mopos = buf.indexOf("\n");

        // 检查数据格式是否完整
        if (colonPos != -1) {
            commaPos = buf.indexOf(",", colonPos);
            if (commaPos != -1) {
                secondCommaPos = buf.indexOf(",", commaPos + 1);
            }
        }

        if (colonPos != -1 && commaPos != -1 && secondCommaPos != -1 && mopos != -1) {
            QString StrI1 = QString::fromUtf8(buf.mid(colonPos + 1, commaPos - colonPos - 1));
            QString StrI2 = QString::fromUtf8(buf.mid(commaPos + 1, secondCommaPos - commaPos - 1));
            QString StrI3 = QString::fromUtf8(buf.mid(secondCommaPos + 1, mopos - secondCommaPos - 1));

            bool ok1, ok2, ok3;
            double dataI1 = StrI1.toFloat(&ok1);
            double dataI2 = StrI2.toFloat(&ok2);
            double dataI3 = StrI3.toFloat(&ok3);

        if (!ok1 || !ok2 || !ok3) {
            // 处理转换失败的情况
            qDebug() << "Failed to convert string to float.";
            return;
        }

        ui->textBrowser->insertPlainText(str); // 在接收框里显示
        ui->textBrowser->moveCursor(QTextCursor::End); // 光标移到最后一行

        mycurrenttime = QDateTime::currentDateTime(); // 获取系统时间
        double xzb = mystarttime.msecsTo(mycurrenttime) / 10.0; // 获取横坐标，相对时间就是从0开始

        ui->customPlot->graph(0)->addData(xzb, dataI1); // 添加数据1到曲线1
        ui->customPlot->graph(1)->addData(xzb, dataI3); // 添加数据2到曲线2

//        if (xzb > 30) {
//            ui->customPlot->xAxis->setRange((double)qRound(xzb - 1000), xzb); // 设定x轴的范围
//        } else {
//            ui->customPlot->xAxis->setRange(0, 1000); // 设定x轴的范围
//        }
        ui->customPlot->replot(); // 每次画完曲线一定要更新显示
    }
});
}
}
void MainWindow::setplot()
{

QCustomPlot *customPlot = ui->customPlot;
   ui->customPlot->addGraph();//添加一条曲线
   QPen pen;
   pen.setWidth(1);//设置画笔线条宽度
   pen.setColor(Qt::blue);
   ui->customPlot->graph(0)->setPen(pen);//设置画笔颜色
//   ui->customPlot->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 20))); //设置曲线画刷背景
   ui->customPlot->graph(0)->setName("0-100");
   ui->customPlot->graph(0)->setAntialiasedFill(false);
   ui->customPlot->graph(0)->setLineStyle((QCPGraph::LineStyle)1);//曲线画笔
   ui->customPlot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssNone,5));//曲线形状


   ui->customPlot->addGraph();//添加一条曲线
   pen.setColor(Qt::red);
   ui->customPlot->graph(1)->setPen(pen);//设置画笔颜色
//   ui->customPlot->graph(1)->setBrush(QBrush(QColor(0, 0, 255, 20))); //设置曲线画刷背景
   ui->customPlot->graph(1)->setName("0-100");
   ui->customPlot->graph(1)->setAntialiasedFill(false);
   ui->customPlot->graph(1)->setLineStyle((QCPGraph::LineStyle)1);//曲线画笔
   ui->customPlot->graph(1)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssNone,5));//曲线形状

   //设置图表
   ui->customPlot->xAxis->setLabel(QStringLiteral("时间/10m s"));//设置x坐标轴名称
   ui->customPlot->xAxis->setLabelColor(QColor(20,20,20));//设置x坐标轴名称颜色
//   ui->customPlot->xAxis->setAutoTickStep(false);//设置是否自动分配刻度间距
//   ui->customPlot->xAxis->setTickStep(2);//设置刻度间距5
//   ui->customPlot->xAxis->setRange(0,30);//设定x轴的范围

   ui->customPlot->yAxis->setLabel(QStringLiteral("PH & TDS"));//设置y坐标轴名称
   ui->customPlot->yAxis->setLabelColor(QColor(20,20,20));//设置y坐标轴名称颜色
//   ui->customPlot->yAxis->setAutoTickStep(false);//设置是否自动分配刻度间距
//   ui->customPlot->yAxis->setTickStep(10);//设置刻度间距1
//   ui->customPlot->yAxis->setRange(0,100);//设定y轴范围

   ui->customPlot->axisRect()->setupFullAxesBox(true);//设置缩放，拖拽，设置图表的分类图标显示位置
   ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom| QCP::iSelectAxes);
   ui->customPlot->axisRect()->insetLayout()->setInsetAlignment(0,Qt::AlignTop | Qt::AlignRight);//图例显示位置右上
   ui->customPlot->legend->setVisible(true);//显示图例

   ui->customPlot->replot();

}
